logo头像

野渡's小小知识乐园

《TCP-IP详解卷1》第2章 链路层

在TCP/IP协议族中,链路层主要有三个目的:

  • (1)为IP模块发送和接收IP数据报;
  • (2)为ARP模块发送ARP请求和接收ARP应答;
  • (3)为RARP发送RARP请求和接收RARP应答。

TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等。

本节我们将详细讨论以太网链路层协议,两个串行接口链路层协议(SLIP和PPP),以及大多数实现都包含的环回(loopback)驱动程序。以太网和SLIP是本书中大多数例子使用的链路层。对MTU(最大传输单元)进行了介绍,这个概念在本书的后面章节中将多次遇到。我们还讨论了如何为串行线路选择MTU。

1、以太网和IEEE 802封装

以太网是指数字设备公司、英特尔公司(Intel Corp)和 Xerox 公司在1982年联合公布的一个标准;它是当今TCP/IP采用的主要的局域网技术。它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入。它的速率为10Mb/s,地址为48bit。

802是IEEE(电子电气工程师协会)802委员会公布的一个稍有不同的标准集合。其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络。

在TCP/IP世界中,以太网IP数据报的封装是在RFC894中定义的,IEEE 802网络的IP数据报封装是在RFC1042中定义的。RFC要求主机必须支持以太网格式的封装,默认也是以太网格式。下图显示了两种不同形式的封装格式:

image

两种帧格式都采用48 bit(6字节)的目的地址和源地址。这就是我们在本书中所称的硬件地址。ARP和RARP协议对32bit的IP地址和48bit的硬件地址进行映射。接下来的2个字节在两种帧格式中互不相同。在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括CRC检验码。CRC字段用于帧内后续字节差错的循环冗余码检验(检验和)。

在以太网帧格式中,类型字段之后就是数据;而在802帧格式中,跟随在后面的是3字节的802.2LLC和5字节的802.2SNAP。目的服务访问点DSAP和源服务访问点SSAP的值都设为0xaa。Ctrl字段的值设为3。随后的3个字节org code都置为0。

802.3标准定义的帧和以太网的帧都有最小长度要求。802.3规定数据部分必须至少为38字节,而对于以太网,则要求最少要有46字节。为了保证这一点,必须在不足的空间插入填充字节。

从以太网的封装格式可以看出,我们需要一种协议来正确提取IP数据报的信息,所以引入了接下来两节将要讨论的问题。

2、SLIP:串行线路IP

SLIP的全称是Serial Line IP;它是一种在串行线路上对IP数据报进行封装的简单形式,在RFC 1055中有详细描述;SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet

SLIP协议以以下几条规则定义帧格式:

  • IP数据报以一个称作END(0xc0)的特殊字符结束。同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个END字符;
  • 如果IP报文中某个字符为END,那么就要连续传输两个字节0xdb和0xdc来取代它;0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符(0x1b)不同;
  • 如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和0xdd来取代它;

image

SLIP是一种简单的帧封装方法,还有一些不得一提的缺陷,如:

  • 每一端必须知道对方的IP地址,没有办法把本端的IP地址通知给另一端;
  • 数据帧中没有类型字段(类似于以太网中的类型字段),如果一条串行线路用于SLIP,那么它不能同时使用其他协议;
  • SLIP没有在数据帧中加上检验和,需要上层协议提供某种形式的CRC;

3、CSLIP:压缩的SLIP

由于串行线路的速率通常较低,而且通信经常是交互式的,因此在SLIP线路上有许多小的TCP分组进行交换。为了传送1个字节的数据需要20个字节的IP首部和20个字节的TCP首部,总数超过40个字节;于是人们提出一个被称作CSLIP(即压缩SLIP)的新协议,它在RFC 1144中被详细描述;

CSLIP一般能把上面的40个字节压缩到3或5个字节来记录变化部分。它能在CSLIP的每一端维持多达16个TCP连接,并且知道其中每个连接的首部中的某些字段一般不会发生变化。

4、PPP:点对点协议

PPP,点对点协议修改了SLIP协议中的所有缺陷。PPP包括以下三个部分:

  • 在串行链路上封装IP数据报。PPP既支持数据为8位和无奇偶检验的异步模式,还支持面向比特的同步链接;
  • 建立、配置及测试数据链路的链路控制协议LCP。它允许通信双方进行协商,以确定不同的选项;
  • 针对不同网络层协议的网络控制协议NCP体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk;例如,IP NCP允许双方商定是否对报文首部进行压缩;

image

上图是PPP数据帧的格式。每一帧都以标志字符0x7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一个值为0x03的控制字节。由于标志字符的值是0x7e,因此当该字符出现在信息字段中时,PPP需要对它进行转义。

总的来说,PPP比SLIP具有下面这些优点:

  • (1) PPP支持在单根串行线路上运行多种协议,不只是IP协议;
  • (2) 每一帧都有循环冗余检验;
  • (3) 通信双方可以进行IP地址的动态协商(使用NCP);
  • (4) 与CSLIP类似,对TCP和IP报文首部进行压缩;
  • (5) 链路控制协议可以对多个数据链路选项进行设置。为这些优点付出的代价是在每一帧的首部增加3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。

尽管PPP比SLIP有更多的优点,但是现在的SLIP用户仍然比PPP用户多。随着产品越来越多,产家也开始逐渐支持PPP,因此最终PPP应该取代SLIP。

5、环回接口

大多数的产品都支持环回接口,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。其主要实现原理就是将IP数据报通过内核的IP输出函数放到IP输入队列中,从而进行输入处理。

需要注意以下几个关键点:

  • 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
  • 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。
  • 任何传给该主机IP地址的数据均送到环回接口。

6、最大传输单元MTU

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称作MTU,最大传输单元

如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。

7、路径MTU

如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作路径MTU

两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。RFC1191描述了怎么样确定MTU。

8、小结

本章讨论了Internet协议族中的最底层协议,链路层协议。我们比较了以太网和IEEE802.2/802.3的链路层封装格式,以及SLIP和PPP链路层协议。由于SLIP和PPP经常用于低速的链路,二者都提供了压缩不常变化的公共字段的方法。这使交互性能得到提高。

大多数的实现都提供环回接口。访问这个接口可以通过特殊的环回地址,一般为127.0.0.1。也可以通过发送IP数据报给主机所拥有的任一IP地址。当环回数据回到上层的协议栈中时,它已经过传输层和IP层完整的处理过程。

我们描述了很多链路都具有的一个重要特性,MTU,相关的一个概念是路径MTU。根据典型的串行线路MTU,对SLIP和CSLIP链路的传输时延进行了计算。本章的内容只覆盖了当今TCP/IP所采用的部分数据链路公共技术。TCP/IP成功的原因之一是它几乎能在任何数据链路技术上运行。